package com.knight.boot.controller;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.knight.boot.pojo.Books;
import com.knight.boot.pojo.BooksVo;
import com.knight.boot.servise.BookService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.util.List;

/**
 * @Author: Guohai
 * @Date: 2020-07-25 22:14
 */
@Controller
@RequestMapping("/book")
public class BookController {

    @Autowired
    @Qualifier("BookServiceImpl")
    private BookService bookService;

    /**
     * 查询全部的书籍，并返回到一个书籍展示页面（无分页查询）
     * @param model
     * @return
     */
    @RequestMapping("/allBook")
    public String list(Model model){
        List<Books> list = bookService.quertAllBook();
        model.addAttribute("list",list);
        return "allBook";
    }

    /**
     * 跳转添加页面
     * @return
     */
    @RequestMapping("/toAddBook")
    public String toAddPage(){
        return "addBook";
    }

    /**
     * 添加图书信息
     * @param booksVo
     * @return
     */
    @RequestMapping("/addBook")
    public String addBook(BooksVo booksVo, HttpSession session) throws IOException {
        final MultipartFile file = booksVo.getFile();

//  用session来获取应用域
        ServletContext servletContext = session.getServletContext();
//  通过应用域 获取的是target/项目名的真实路径
        String reath = servletContext.getRealPath("img");
        String contextPath = servletContext.getContextPath();
//  获取上传的文件的文件名
        String filename = file.getOriginalFilename();
//  创建目录
        File fileDir = new File(reath);
        if (!fileDir.exists()){//判断目录是否存在，不存在就创建
            fileDir.mkdir();
        }
//  设置上传文件真实保存路径
        String finalPath = reath + File.separator +filename;
//  用 '文件保存的路径' 创建的一个文件
        File file_ = new File(finalPath);
//    transferTO 将文件转移，将左边的文件内容转移到右边的文件里
        file.transferTo(file_);

        Books books = new Books();
        BeanUtils.copyProperties(booksVo, books);
//        books.setFileName(finalPath);
        books.setFileName(contextPath + "/img/" + filename);
        bookService.addBook(books);
        return "redirect:/book/allBooks";//重定向查询请求中
    }

    @PostMapping("/addFile")
    public String addFile(MultipartFile file, HttpSession session) throws IOException {
//  查看是否获取到文件
        System.out.println(file);
//  用session来获取应用域
        ServletContext servletContext = session.getServletContext();
//  通过应用域 获取的是target/项目名的真实路径
        String reath = servletContext.getRealPath("img");
        String contextPath = servletContext.getContextPath();
//  获取上传的文件的文件名
        String filename = file.getOriginalFilename();
//  创建目录
        File fileDir = new File(reath);
        if (!fileDir.exists()){//判断目录是否存在，不存在就创建
            fileDir.mkdir();
        }
//  设置上传文件真实保存路径
        String finalPath = reath + File.separator +filename;
//  用 '文件保存的路径' 创建的一个文件
        File file_ = new File(finalPath);
//    transferTO 将文件转移，将左边的文件内容转移到右边的文件里
        file.transferTo(file_);
        return "redirect:/book/allBooks";//重定向查询请求中
    }

        /**
         * 跳转更新页面  并回显页面信息
         * @param id
         * @param model
         * @return
         */
    @RequestMapping("/toUpdateBook")
    public String toUpdateBook(int id,Model model){
        Books books = bookService.queryBookById(id);
        System.err.println("toUpdateBook=>" + books);
        model.addAttribute("QBook",books);
        return "updateBook";
    }

    /**
     * 更新图书信息
     * @param books
     * @return
     */
    @RequestMapping("/updateBook")
    public String updateBook(Books books){
        //System.err.println("updateBook=>" +books);
        bookService.updateBook(books);
        return "redirect:/book/allBooks";//重定向查询请求中
    }

    /**
     * 删除图书信息
     * @param id
     * @return
     */
    @RequestMapping("/deleteBook/{bookId}")
    public String deleteBook(@PathVariable("bookId") int id){
        bookService.deleteBookById(id);
        return "redirect:/book/allBooks";//重定向查询请求中
    }

    /**
     * 查询书籍数据（包含分页）
     * @param pn
     * @param model
     * @return
     */
    @RequestMapping("/allBooks")
    public String getBooks(@RequestParam(value = "pn",defaultValue = "1") Integer pn , Model model){
        // 这不是一个分页查询；
        // 引入PageHelper分页插件
        // 在查询之前只需要调用，传入页码，以及每页的大小
        PageHelper.startPage(pn,5);
        // startPage后面紧跟的这个查询就是一个分页查询
        List<Books> list = bookService.quertAllBook();
        // 使用pageInfo包装查询后的结果，只需要将pageInfo交给页面就行了。
        // 封装了详细的分页信息,包括有我们查询出来的数据，传入连续显示的页数
        PageInfo pageInfo = new PageInfo(list,3);
        model.addAttribute("pageInfo",pageInfo);
        return "allBook";
    }

    /**
     * 根据图书名 --> 条件查询图书
     * @param queryBookName
     * @param model
     * @return
     */
    @RequestMapping("/queryBook")
    public String queryBook(String queryBookName,Model model,@RequestParam(value = "pn",defaultValue = "1") Integer pn){
        List<Books> books = bookService.queryBookByName("%"+queryBookName+"%");
        System.err.println("queryBook=>"+books);

        if (books == null){
            return "redirect:/book/allBooks";
        }
        PageHelper.startPage(pn,5);
        PageInfo pageInfo = new PageInfo(books,3);
        model.addAttribute("pageInfo",pageInfo);
        model.addAttribute("list",books);
        return "allBook";
    }
}
